package br.fesppr.sacob.compilador.analizador;

import br.fesppr.sacob.compilador.util.Dominios;
import br.fesppr.sacob.compilador.entidade.Token;

public class ObtemToken {
	
	private String consulta;
	private Token token;
	private int count;
	private boolean indErro;
	
	public void setConsultaSQL(String consulta){
		this.consulta = consulta;
		this.count = 0;
		this.token = new Token();
	}
	
	public int getTamanhoConsulta(){
		return consulta.length() - 1;
	}
	
	public int getPosicaoCursor(){
		return count;
	}
	
	public boolean getIndErro(){
		return indErro;
	}
	
	public Token obterProximoToken(){
		
		token.setValor("");
		
		if(Character.isLetter(consulta.charAt(count))){
			
			c1();
			token.setTipo(Dominios.CARACTER);
			
			return token;
			
		}else if(Character.isDigit(consulta.charAt(count))){
			
			n1();
			token.setTipo(Dominios.NUMERO);
			
			return token;
			
		}else if(consulta.charAt(count) == ';' ||
				consulta.charAt(count) == ','){
			
			pv1();
			token.setTipo(Dominios.SEPARADOR);
			
			return token;
			
		}else if(consulta.charAt(count) == ' '){
			
			b1();
			return obterProximoToken();
		}
		
		token.setValor("Erro em ou pr�ximo a "+ erro());
		token.setTipo(Dominios.ERRO);
		
		return token;
	}
	
	public void c1(){
		
		if(count <= getTamanhoConsulta() && 
				(Character.isLetter(consulta.charAt(count)) || 
				Character.isDigit(consulta.charAt(count)) || 
				consulta.charAt(count) == '_')){

			token.setValor(token.getValor() + consulta.charAt(count));
			count ++;
			
			c1();
			
		}

	}

	public void n1(){
		if(count <= getTamanhoConsulta() && 
				(Character.isDigit(consulta.charAt(count)) ||
				consulta.charAt(count) == '.')){
			
			token.setValor(token.getValor() + consulta.charAt(count));
			count ++;
			
			n1();
		}
	}

	public void pv1(){
		
		token.setValor(token.getValor() + consulta.charAt(count));
		count++;

	}
	
	public void b1(){
		
		if(count <= getTamanhoConsulta() && 
				(consulta.charAt(count) == ' ' || 
				consulta.charAt(count) == Character.LINE_SEPARATOR)){
			
			count ++;
			b1();
			
		}
	}
	
	public String erro(){
		
		indErro = true;
		String erro = "";
		int c = 0;
		
		erro = "'"+ token;
		while(c < Dominios.TAMANHO_MSG_ERRO && (count <= getTamanhoConsulta())){
			
			erro += consulta.charAt(count);
			count ++;
			c ++;
		}
		
		erro += "'";
		
		return erro;
		
	}
	
}
